# -☞- coding: utf-8 -☞-
import hashlib
import urllib
import web
import lxml
import time
import os
import urllib2, json
import turing
import imagetest
import translate
import oxford
import uploadFile
from lxml import etree


class WeixinWelcome:
    def __init__(self):
        self.app_root = os.path.dirname(__file__)
        self.templates_root = os.path.join(self.app_root, 'templates')#temples文件夹为恢复的XML模板
        self.render = web.template.render(self.templates_root)

    def GET(self):
        # 获取输入参数
        data = web.input()
        signature = data.signature
        timestamp = data.timestamp
        nonce = data.nonce
        echostr = data.echostr
        # 自己的token
        token = "*********"  # 这里改写你在微信公众平台里输入的token
        # 字典序排序
        list = [token, timestamp, nonce]
        list.sort()
        sha1 = hashlib.sha1()
        map(sha1.update, list)
        hashcode = sha1.hexdigest()
        # sha1加密算法
        # 如果是来自微信的请求,则回复echostr
        if hashcode == signature:
            return echostr

    def POST(self):
        str_xml = web.data()  # 获得post来的数据
        xml = etree.fromstring(str_xml)  # 进行XML解析
        # content=xml.find("Content").text#获得用户所输入的内容
        msgType = xml.find("MsgType").text
        fromUser = xml.find("FromUserName").text
        toUser = xml.find("ToUserName").text
        if msgType == "event":
            mscontent = xml.find("Event").text
            if mscontent == "subscribe":
                replayText = u'''欢迎关注PowerPoint微信订阅号,本公众号现支持如下功能:\n☞【聊天对话】:直接输入聊天信息\n☞【生活百科】:直接输入查询信息\n☞【数字计算】:输入如"23+18"\n☞【星座运势】,输入如"巨蟹运势"\n☞【新闻资讯】:开发中,输入“新闻”\n☞【快递查询】:输入快递+单号,如申通123456789或快递1234567\n☞【笑话大全】:输入“笑话”\n☞【天气查询】:如输入“南京天气”\n☞【列车航班】:如“K616“,“南京到北京”,“南京到北京动车/飞机”\n☞【语言翻译】:输入如“翻译你好”,"翻译Hello"\n☞【图片识别】:直接发送图片\n'''
                return self.render.reply_text(fromUser, toUser, int(time.time()), replayText)
            if mscontent == "unsubscribe":
                replayText = u'我现在功能还很简单,暂时满足不了您的需求,但是我会慢慢改进,欢迎您以后再来'
                return self.render.reply_text(fromUser, toUser, int(time.time()), replayText)
        if msgType == 'text':
            content = xml.find("Content").text
            if content == u"生命中的第几天":
                content = "点击下面这个链接就可以查看今天是你生命中的第几天啦！☞http://www.ixingo.cn/weixin/year"
                return self.render.reply_text(fromUser, toUser, int(time.time()), content)
            if content == '王欣':
                content = u'骚年,我叫汪欣,不过我看你骨骼精奇,不如加我个微博关注@伟大的星狗,一起走向人生巅峰怎么样.\n还有偷偷告诉你下面这个网址http://www.ixingo.cn/zb,带你装逼带你飞.'
                return self.render.reply_text(fromUser, toUser, int(time.time()), content)
            if content == '汪欣':
                musicurl = 'http://www.tingge123.com/mp3/2016-01-23/1453535586.mp3'
                musicdes = u'一首小幸运送给你'
                musictitle = u'汪欣献给好人的奏鸣曲'
                return self.render.reply_music(fromUser, toUser, int(time.time()), musictitle, musicdes, musicurl)
            if content == '汪欣的百科':
                content = u'''PowerPoint微信订阅号现支持如下功能:\n☞【聊天对话】:直接输入聊天信息\n☞【生活百科】:直接输入查询信息\n☞【数字计算】:输入如"23+18"\n☞【星座运势】,输入如"巨蟹运势"\n☞【新闻资讯】:开发中,输入“新闻”\n☞【快递查询】:输入快递+单号,如申通123456789或快递1234567\n☞【笑话大全】:输入“笑话”\n☞【天气查询】:如输入“南京天气”\n☞【列车航班】:如“K616“,“南京到北京”,“南京到北京动车/飞机”\n☞【语言翻译】:输入如“翻译你好”,"翻译Hello"\n☞【图片识别】:直接发送图片\n'''
                return self.render.reply_text(fromUser, toUser, int(time.time()), content)
            if content == 'help' or content == '1' or content == '7' or content == '11' or content == '9' or content == u'帮助':
                replayText = u'''PowerPoint微信订阅号现支持如下功能:\n☞【聊天对话】:直接输入聊天信息\n☞【生活百科】:直接输入查询信息\n☞【数字计算】:输入如"23+18"\n☞【星座运势】,输入如"巨蟹运势"\n☞【新闻资讯】:开发中,输入“新闻”\n☞【快递查询】:输入快递+单号,如申通123456789或快递1234567\n☞【笑话大全】:输入“笑话”\n☞【天气查询】:如输入“南京天气”\n☞【列车航班】:如“K616“,“南京到北京”,“南京到北京动车/飞机”\n☞【语言翻译】:输入如“翻译你好”,"翻译Hello"\n☞【图片识别】:直接发送图片\n'''
                return self.render.reply_text(fromUser, toUser, int(time.time()), replayText)
            if content == 'music' or content == u'音乐':
                musicurl = 'http://www.tingge123.com/mp3/2016-01-23/1453535586.mp3'
                musicdes = u'一首小幸运送给你'
                musictitle = u'汪欣献给好人的奏鸣曲'
                return self.render.reply_music(fromUser, toUser, int(time.time()), musictitle, musicdes, musicurl)
            if content[0:2] == u"翻译":
                post = (content[2:]).encode('utf-8')
                trans = translate.youdao(post)
                return self.render.reply_text(fromUser, toUser, int(time.time()), trans)
            else:
                content = turing.result(content, fromUser)
                return self.render.reply_text(fromUser, toUser, int(time.time()), content)
        if msgType == 'image':
            try:
                picurl = xml.find('PicUrl').text
                content = oxford.result(picurl)
                # url = uploadFile.uploadfile(picurl)
                return self.render.reply_text(fromUser, toUser, int(time.time()), content)
                # datas = imagetest.imgtest(picurl)
                # return self.render.reply_text(fromUser, toUser, int(time.time()),
                #                                   '您这张图片中是一位' + datas[0] + '\n' + '年龄为' + datas[1] + '\n\n本图片由微软&汪欣提供识别服务')
            except:
                return self.render.reply_text(fromUser, toUser, int(time.time()),
                                              '额...好尴尬...识别失败了,再发一遍或者换张图片试试吧...当前仅支持人物识别.\n建议使用人物正面图片以获得更好的识别效果(图片中人物需要正面向上,横着或者倒置也会导致识别失败哦~).')
        if msgType == 'voice':
            content = xml.find('Recognition').text
            try:
                msg = turing.result(content, fromUser)
                return self.render.reply_text(fromUser, toUser, int(time.time()), msg)
            except:
                return self.render.reply_text(fromUser, toUser, int(time.time()), content + '额,呵呵,今天天气不错,不如我们换个话题？')
                # return self.render.reply_voice(fromUser, toUser, int(time.time()), media_id)
        else:
            content = u'这个消息人类不能识别,额...对了,我不是人类,也不能识别...很尴尬'
            return self.render.reply_text(fromUser, toUser, int(time.time()), content)